package com.hospital.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDate;

/**
 * 药品实体类
 *
 * @author Hospital Management System
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("tb_medicine")
public class Medicine extends BaseEntity {

    /**
     * 药品ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 药品编码
     */
    @TableField("medicine_code")
    private String medicineCode;

    /**
     * 药品名称
     */
    @TableField("name")
    private String name;

    /**
     * 通用名称
     */
    @TableField("generic_name")
    private String genericName;

    /**
     * 药品分类（1-西药，2-中药，3-中成药，4-生物制品）
     */
    @TableField("category")
    private Integer category;

    /**
     * 药品类型（1-处方药，2-非处方药）
     */
    @TableField("type")
    private Integer type;

    /**
     * 规格
     */
    @TableField("specification")
    private String specification;

    /**
     * 单位
     */
    @TableField("unit")
    private String unit;

    /**
     * 生产厂家
     */
    @TableField("manufacturer")
    private String manufacturer;

    /**
     * 批准文号
     */
    @TableField("approval_number")
    private String approvalNumber;

    /**
     * 进价
     */
    @TableField("purchase_price")
    private BigDecimal purchasePrice;

    /**
     * 售价
     */
    @TableField("selling_price")
    private BigDecimal sellingPrice;

    /**
     * 库存数量
     */
    @TableField("stock_quantity")
    private Integer stockQuantity;

    /**
     * 安全库存
     */
    @TableField("safety_stock")
    private Integer safetyStock;

    /**
     * 最大库存
     */
    @TableField("max_stock")
    private Integer maxStock;

    /**
     * 生产日期
     */
    @TableField("production_date")
    private LocalDate productionDate;

    /**
     * 有效期
     */
    @TableField("expiry_date")
    private LocalDate expiryDate;

    /**
     * 存储条件
     */
    @TableField("storage_condition")
    private String storageCondition;

    /**
     * 药品状态（0-停用，1-正常，2-缺货，3-过期）
     */
    @TableField("status")
    private Integer status;

    /**
     * 用法用量
     */
    @TableField("dosage")
    private String dosage;

    /**
     * 功能主治
     */
    @TableField("indications")
    private String indications;

    /**
     * 不良反应
     */
    @TableField("adverse_reactions")
    private String adverseReactions;

    /**
     * 禁忌症
     */
    @TableField("contraindications")
    private String contraindications;

    /**
     * 注意事项
     */
    @TableField("precautions")
    private String precautions;

    /**
     * 备注
     */
    @TableField("remark")
    private String remark;

    // ==================== 关联查询字段 ====================

    /**
     * 分类名称
     */
    @TableField(exist = false)
    private String categoryName;

    /**
     * 类型名称
     */
    @TableField(exist = false)
    private String typeName;

    /**
     * 状态名称
     */
    @TableField(exist = false)
    private String statusName;

    /**
     * 库存状态（计算字段）
     */
    @TableField(exist = false)
    private String stockStatus;

    /**
     * 获取分类名称
     */
    public String getCategoryName() {
        if (category == null) {
            return null;
        }
        switch (category) {
            case 1:
                return "西药";
            case 2:
                return "中药";
            case 3:
                return "中成药";
            case 4:
                return "生物制品";
            default:
                return "未知";
        }
    }

    /**
     * 获取类型名称
     */
    public String getTypeName() {
        if (type == null) {
            return null;
        }
        switch (type) {
            case 1:
                return "处方药";
            case 2:
                return "非处方药";
            default:
                return "未知";
        }
    }

    /**
     * 获取状态名称
     */
    public String getStatusName() {
        if (status == null) {
            return null;
        }
        switch (status) {
            case 0:
                return "停用";
            case 1:
                return "正常";
            case 2:
                return "缺货";
            case 3:
                return "过期";
            default:
                return "未知";
        }
    }

    /**
     * 获取库存状态
     */
    public String getStockStatus() {
        if (stockQuantity == null || safetyStock == null) {
            return "未知";
        }
        
        if (stockQuantity <= 0) {
            return "缺货";
        } else if (stockQuantity <= safetyStock) {
            return "库存不足";
        } else {
            return "库存充足";
        }
    }

    /**
     * 判断是否即将过期（30天内）
     */
    public boolean isNearExpiry() {
        if (expiryDate == null) {
            return false;
        }
        return expiryDate.isBefore(LocalDate.now().plusDays(30));
    }

    /**
     * 判断是否已过期
     */
    public boolean isExpired() {
        if (expiryDate == null) {
            return false;
        }
        return expiryDate.isBefore(LocalDate.now());
    }
} 